//classe para cadastro de conta, cada conta é veinculada a um grupo.
//Serão cadastrados descrição da conta, e tipo da conta (pagamento ou recebimento) 
//grupo a qual a conta pertence
package fmu.pi.view.draw.old;

import javafx.scene.layout.HBox; 
import javafx.scene.layout.GridPane;
import javafx.scene.layout.BorderPane; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TableView;
import javafx.scene.control.TableColumn; 
import java.util.ArrayList; 
import fmu.pi.model.bean.Grupo; 
import fmu.pi.model.bean.Conta; 
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Button; 
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import fmu.pi.view.handler.HandlerView; 
import javafx.scene.control.*;
import javax.swing.JOptionPane;

public class CadastraConta extends BorderPane
{
    private Label contaLabel; //Titulo para TextField conta
    private TextField contaTextField; //recebe o nome da conta
    private TextField grupoTextField; //recebe o nome do grupo
    private TextField alteraContaTextField; //nome da conta a ser alterada
    private TextField alteraGrupoTextField; //nome do grupo a ser alterado
    private ListView groupListView; //lista de grupo
    private ListView alteraGroupListView; //lista de grupo a ser alterada
    private TableView tableAccount; //tabela de contas cadastradas no banco de dados
    private ChoiceBox tipoConta; // tipo da conta a ser cadastrada receber ou pagar
    private ChoiceBox alteraTipoConta; //tipo da conta a ser alterada
    private Button salvarButton; //botão para salvar conta
    private Button alteraButton; //botão para alterar conta
    private Button deletButton; //botão para apagar conta do banco
    private Button cancelaButton; //botão para calncelar 
    private Grupo grupoSelected;  //grupo selecionado na lista de grupo
    private Conta contaSelected; //conta selecionada na tabela
    private GridPane gridAlteraConta; //grid com componentes para alterar contas
    private ArrayList<Grupo> grupos;  //lista de grupos
    private HandlerView handler; //trata eventos
    private String tipoDaContaStr;  //tipo da conta selecionada no ChoiceBox
    
    //construtor
    public CadastraConta()
    {
        initPane();  
       
    }
    
    //inicia o painel
    private void initPane()
    {
        handler = new HandlerView();
        setCenter(boxPane()); 
    }
    
    //box com cadastro de conta e alteração
    private HBox boxPane()
    {
  
        HBox box = new HBox(); 
        box.getChildren().addAll(editaTextField(), 
               gridTableAccount(), alteraConta());
        
        return box; 
    }
    
    //cria formulario para cadastro da conta
    private GridPane editaTextField()
    {
        GridPane grid = new GridPane();
        grid.setHgap(10); 
        grid.setVgap(10); 
        
        for(int i = 0; i < 8; i++)
            grid.add(new Rectangle(15, 30, Color.TRANSPARENT), 0, i);
        
        for(int i = 0; i < 8; i++)
            grid.add(new Rectangle(160, 30, Color.TRANSPARENT), 1, i);
        
        for(int i = 0; i < 8; i++)
            grid.add(new Rectangle(15, 30, Color.TRANSPARENT), 2, i);
        
        Label contaLabel = new Label(); 
        contaLabel.setText("Conta: "); 
        contaLabel.setTextFill(Color.DARKBLUE); 
        contaLabel.setFont(Font.font("Ariel Black", 15)); 
        grid.add(contaLabel, 1, 1); 
        
        Label grupoLabel = new Label(); 
        grupoLabel.setText("Grupo: "); 
        grupoLabel.setTextFill(Color.DARKBLUE); 
        grupoLabel.setFont(Font.font("Ariel Black", 15));
        grid.add(grupoLabel, 1, 4); 
        
        Label tabelaGrupo = new Label(); 
        tabelaGrupo.setText("Tabela Grupo"); 
        tabelaGrupo.setTextFill(Color.DARKBLUE); 
        tabelaGrupo.setFont(Font.font("Ariel Black", 15));
        grid.add(tabelaGrupo, 1, 6); 
        
        contaTextField = new TextField(); 
        contaTextField.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 
        contaTextField.setText("Digite o nome da conta"); 
        grid.add(contaTextField, 1, 2); 
        
        tipoConta = new ChoiceBox(); 
        tipoConta.setItems(
                FXCollections.observableArrayList("receber", "pagar"));
        tipoConta.setOnMouseClicked(new EventHandler<MouseEvent>()
        {
            public void handle(MouseEvent event)
            {
                tipoDaContaStr = (String) 
                        tipoConta.getSelectionModel().getSelectedItem(); 
            }
        });
        grid.add(tipoConta, 1, 3); 
        
        grupoTextField = new TextField(); 
        grupoTextField.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 
        grupoTextField.setText("Escolha o grupo na tabela");
        grupoTextField.setEditable(false); 
        grid.add(grupoTextField, 1, 5); 
        
        salvarButton = new Button(); 
        salvarButton.setText("Salvar"); 
        salvarButton.setMaxSize(80, 22); 
        salvarButton.setOnAction(new CadastraConta.SalveButtonHandler()); 
        grid.add(salvarButton, 1, 7); 
        
        groupListView = createListGroup(); 
        grid.add(groupListView, 1, 6); //adiciona tabela de grupo para seleção do grupo
        
        groupListView.setOnMouseClicked(new CadastraConta.SelectGrupo(1));
        
        return grid; 
    }
    
    //grid para adicionar tabela de contas na tela
    private GridPane gridTableAccount()
    {
       GridPane grid = new GridPane(); 
       
       grid.add(new Rectangle(200, 200, Color.TRANSPARENT), 0, 0); 
       tableAccount = createTableAccount(); 
       tableAccount.setOnMouseClicked(new EventHandler<MouseEvent>()
       {
            @Override
            public void handle(MouseEvent event)
            {
                gridAlteraConta.setVisible(true); 
                contaSelected = (Conta) tableAccount.getSelectionModel().getSelectedItem();
                
                if(contaSelected != null)
                {
                    alteraContaTextField.setText(contaSelected.getNome()); 
                    alteraGrupoTextField.setText("");
                }
            }
        }
        );
       
       grid.add(tableAccount, 0, 1); 
       
       return grid; 
    }
    
    //cria lista de grupos
    private ListView createListGroup()
    {
        ListView groupLV = new ListView();
        groupLV.setMaxSize(90, 90); 
        
        ObservableList<Grupo> grupoList = 
                FXCollections.observableArrayList((ArrayList<Grupo>)handler.getGroupList()); 
        
        groupLV.setItems(grupoList); 
        
        return groupLV; 
    }
    
    //cria tabela que carrega todas as contas armazenadas no banco,
    //a conta selecionada na tabela pode ser modificada
    private TableView createTableAccount()
    {
        TableView table = new TableView();
        table.setMaxSize(160, 200); 
        
        ObservableList listAccount =
                FXCollections.observableArrayList(handler.getAccountList());
        
        TableColumn tipoColumn = new TableColumn("Tipo");
        tipoColumn.setCellValueFactory(
                new PropertyValueFactory<Conta, String>("tipo"));
        
        TableColumn nomeColumn = new TableColumn("Nome"); 
        nomeColumn.setCellValueFactory(
                new PropertyValueFactory<Conta, String>("nome"));
        
        table.getColumns().addAll(nomeColumn, tipoColumn);
        
        table.setItems(listAccount); 
          
        return table; 
    }
    
    //grid com o um formulario para alteração de contas
    //o grid somente fica visivel se uma linha for selecionada na tebela conta 
    private GridPane alteraConta()
    {
        gridAlteraConta = new GridPane();
        gridAlteraConta.setHgap(10); 
        gridAlteraConta.setVgap(10); 
        gridAlteraConta.setVisible(false); 
        
        gridAlteraConta.add(new Rectangle(200, 190, Color.TRANSPARENT), 0, 0); 
       
        GridPane grid = new GridPane(); 
        for(int i = 0; i < 3; i++)
            grid.add(new Rectangle(120, 30, Color.TRANSPARENT), 1, i); 
        
        alteraContaTextField = new TextField();
        alteraContaTextField.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        alteraContaTextField.setText(""); 
        grid.add(alteraContaTextField, 1, 0); 
        
        alteraGrupoTextField = new TextField(); 
        alteraGrupoTextField.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        alteraGrupoTextField.setEditable(false); 
        grid.add(alteraGrupoTextField, 1, 1); 
        
        alteraTipoConta = new ChoiceBox(); 
        alteraTipoConta.setItems(
                FXCollections.observableArrayList("receber", "pagar")); 
        alteraTipoConta.setOnMouseClicked(new EventHandler<MouseEvent>()
        {
            @Override
            public void handle(MouseEvent event)
            {
                tipoDaContaStr = (String)
                        alteraTipoConta.getSelectionModel().getSelectedItem(); 
            }
        });
        grid.add(alteraTipoConta, 1, 2); 
        
        grid.setHgap(10); 
        grid.setVgap(10); 
        
        gridAlteraConta.add(grid, 0, 1); 
       
        alteraGroupListView = createListGroup(); 
        gridAlteraConta.add(alteraGroupListView, 0, 2);  
        
        alteraGroupListView.setOnMouseClicked(new CadastraConta.SelectGrupo(2));
        
        HBox box = new HBox(); 
        box.setSpacing(10); 
        
        alteraButton = new Button(); 
        alteraButton.setText("Alterar"); 
        alteraButton.setMaxSize(80, 22); 
        alteraButton.setOnAction(new CadastraConta.UpdateButtonHandler()); 
        
        deletButton = new Button(); 
        deletButton.setText("Apagar"); 
        deletButton.setMaxSize(80, 22); 
        deletButton.setOnAction(new CadastraConta.DeletButtonHandler()); 
       
        cancelaButton = new Button(); 
        cancelaButton.setText("Cancelar"); 
        cancelaButton.setMaxSize(80, 22); 
        cancelaButton.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent event)
            {
                initPane();  
            }
        }); 
        
        box.getChildren().addAll(alteraButton, deletButton, cancelaButton); 
        gridAlteraConta.add(box, 0, 3); 
        
        return gridAlteraConta; 
    }
    
    
    
    //classe interna privada para o tratamento de eventos das tabelas grupo
    private class SelectGrupo implements EventHandler<MouseEvent>
    {
        int opc; 
        
        public SelectGrupo(int op)
        {
            super(); 
            this.opc = op; 
        }
        
        @Override
        public void handle(MouseEvent event)
        {   
            if(opc == 1)
            {
                grupoSelected = (Grupo)
                    groupListView.getSelectionModel().getSelectedItem();
                
                if(grupoSelected != null)
                {
                    grupoTextField.setText(null); 
                    grupoTextField.setText(grupoSelected.getNome());
                }
            }
            else
                if(opc == 2)
                {
                    grupoSelected = (Grupo)
                    alteraGroupListView.getSelectionModel().getSelectedItem();
                    alteraGrupoTextField.setText(grupoSelected.getNome()); 
                }
        }
  
    } 
    
    private class SalveButtonHandler implements EventHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event)
        {
            if((!contaTextField.getText().equals("")) 
                    && (tipoDaContaStr != null) && 
                    (!grupoTextField.getText().equals(
                    "Escolha o grupo na tabela")))
            {
                Conta conta = new Conta(); 
                Integer idGrupo = grupoSelected.getIdGrupo(); 
                Integer result = 0; 
                
                conta.setNome(contaTextField.getText()); 
                conta.setTipo(tipoDaContaStr);
                conta.setIdGrupo(idGrupo); 
                                
                result = handler.updateTables(conta, "insert");
                
                if(result >= 1)
                    JOptionPane.showMessageDialog(null, 
                            "Conta inserida com sucesso."); 
                initPane(); //atualiza o painel
            }
            else
                JOptionPane.showMessageDialog(null, 
                        "Preencha todos os campos"); 
        }
    }
    
    private class UpdateButtonHandler implements EventHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event)
        {
            if((!alteraContaTextField.getText().equals("")
                    && (!alteraGrupoTextField.getText().equals("")))
                    &&tipoDaContaStr != null)
            { 
                Integer idGrupo = grupoSelected.getIdGrupo();
                Integer result = 0; 
                
                contaSelected.setNome(alteraContaTextField.getText()); 
                contaSelected.setTipo(tipoDaContaStr);
                contaSelected.setIdGrupo(idGrupo); 
                
                result = handler.updateTables(contaSelected, "update"); 
                
                if(result >=0 )
                    JOptionPane.showMessageDialog(null, 
                            "Conta alterada com sucesso."); 
                initPane(); 
            }
            else
                JOptionPane.showMessageDialog(null, 
                        "preencha todos os campos."); 
        }
    }
    
    private class DeletButtonHandler implements EventHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event)
        {
            Integer result = 0; 
            String message = "Todas as movimentações relacionadas a está" +
                    " conta serão apagadas, deseja Continuar?"; 
                    
            Integer option = JOptionPane.showConfirmDialog(null, message); 
            
            if(option == 0)
            {
                result = handler.updateTables(contaSelected, "delet"); 
                if(result > 0)
                {
                    JOptionPane.showMessageDialog(null, 
                            "Conta apagada com sucesso");
                    initPane();
                }
                else
                    JOptionPane.showMessageDialog(null, "Erro ao apagar a conta"); 
            }
        }
    }
}
